package demo01;

import java.util.LinkedHashMap;
import java.util.Map;

// 假设 MyLinkedHashMap 是一个继承自 LinkedHashMap 的自定义类。
// 在此示例中，我们直接使用 LinkedHashMap 进行演示，其行为是相同的。
public class HanserLinkedHashMapAccessAndPutOrder {
    public static void main(String[] args) {
        // 创建一个 LinkedHashMap，设置初始容量、加载因子，并将访问顺序设置为 true。
        // true 意味着每次访问（get）或修改（put）一个现有键时，该键值对都会被移动到链表的末尾。
        Map<String, String> map = new LinkedHashMap<>(16, 0.75f, true);

        // 步骤 1: 初始数据填充
        map.put("Hanser", "知名虚拟偶像");
        map.put("Hanserwei", "汉瑟薇");
        map.put("Fan", "粉丝");
        map.put("Music", "音乐作品");
        map.put("Community", "粉丝社区");

        System.out.println("--- 初始状态 ---");
        System.out.println(map);
        // 此时，元素按插入顺序排列：{Hanser, Hanserwei, Fan, Music, Community}

        // 步骤 2: 添加一个新键
        map.put("Concert", "线上演唱会");
        System.out.println("\n--- 添加 'Concert' 后 ---");
        System.out.println(map);
        // 新键总是添加到末尾：{Hanser, Hanserwei, Fan, Music, Community, Concert}

        // 步骤 3: 访问一个已存在的键，然后添加一个新键
        map.get("Hanserwei"); // 访问 "Hanserwei"
        // 由于 accessOrder 为 true，"Hanserwei" 会被移动到当前链表的末尾。
        // 此时链表内部顺序：{Hanser, Fan, Music, Community, Concert, Hanserwei}

        map.put("Album", "新专辑"); // 添加新键 "Album"
        // 新键总是添加到末尾。
        System.out.println("\n--- 访问 'Hanserwei' 并添加 'Album' 后 ---");
        System.out.println(map);
        // 最终顺序：{Hanser, Fan, Music, Community, Concert, Hanserwei, Album}
    }
}